```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SpringBoot中的多环境配置管理 | 技术小馆</title>
    <link rel="stylesheet" href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css">
    <link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            color: #333;
            line-height: 1.6;
        }
        h1, h2, h3, h4, h5, h6 {
            font-family: 'Noto Serif SC', serif;
            font-weight: 600;
            color: #2d3748;
        }
        .hero-gradient {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        }
        .code-block {
            background-color: #f6f8fa;
            border-radius: 6px;
            padding: 16px;
            font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
            font-size: 14px;
            line-height: 1.45;
            color: #24292e;
            overflow-x: auto;
            border-left: 3px solid #667eea;
        }
        .feature-card:hover {
            transform: translateY(-5px);
            box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1);
        }
        .mermaid {
            background-color: white;
            border-radius: 8px;
            padding: 20px;
            box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
        }
        .section-divider {
            height: 1px;
            background: linear-gradient(to right, transparent, rgba(0,0,0,0.1), transparent);
            margin: 3rem 0;
        }
        .drop-cap::first-letter {
            float: left;
            font-size: 4.5em;
            line-height: 0.65;
            margin: 0.1em 0.2em 0.1em 0;
            color: #667eea;
            font-family: 'Noto Serif SC', serif;
        }
    </style>
</head>
<body class="bg-gray-50">
    <!-- Hero Section -->
    <section class="hero-gradient text-white py-20">
        <div class="container mx-auto px-6 lg:px-0 max-w-5xl">
            <div class="flex flex-col items-center text-center">
                <h1 class="text-4xl md:text-5xl font-bold mb-6">SpringBoot中的多环境配置管理</h1>
                <p class="text-xl md:text-2xl opacity-90 mb-8 max-w-3xl">掌握Profiles和外部化配置，构建灵活可维护的SpringBoot应用</p>
                <div class="flex space-x-4">
                    <span class="px-4 py-2 bg-white bg-opacity-20 rounded-full flex items-center">
                        <i class="fas fa-code-branch mr-2"></i>
                        <span>Spring Boot</span>
                    </span>
                    <span class="px-4 py-2 bg-white bg-opacity-20 rounded-full flex items-center">
                        <i class="fas fa-server mr-2"></i>
                        <span>配置管理</span>
                    </span>
                </div>
            </div>
        </div>
    </section>

    <!-- Main Content -->
    <main class="container mx-auto px-6 py-12 max-w-5xl">
        <!-- Introduction -->
        <section class="mb-16">
            <div class="mb-8">
                <img src="https://cdn.nlark.com/yuque/0/2025/png/21449790/1736665775874-0dae0c9c-7538-4037-b56c-79c366024d4b.png" alt="SpringBoot配置管理" class="w-full rounded-lg shadow-lg">
            </div>
            <p class="drop-cap text-lg mb-6">
                在开发实际的Java应用时，通常会遇到不同的运行环境，比如开发环境、测试环境和生产环境。每个环境都有不同的配置需求，例如数据库连接信息、服务端口、日志级别等。如果我们没有一个灵活的机制来区分和管理这些不同环境下的配置，代码中的配置就会变得混乱且不易维护。
            </p>
            <p class="text-lg mb-8">
                Spring Boot 提供了强大的多环境配置管理功能，能够帮助我们根据不同的环境加载不同的配置文件，从而让应用在不同的环境下能保持一致性和灵活性。通过合理使用 Spring Boot 的 <code class="bg-blue-100 px-1 py-0.5 rounded">Profile</code> 功能，我们可以在开发、测试和生产等不同环境中，动态地切换配置，避免了硬编码配置的麻烦，提高了系统的可维护性。
            </p>
            
            <div class="bg-blue-50 border-l-4 border-blue-500 p-4 rounded mb-8">
                <div class="flex">
                    <div class="flex-shrink-0">
                        <i class="fas fa-lightbulb text-blue-500 text-xl"></i>
                    </div>
                    <div class="ml-3">
                        <h3 class="text-sm font-medium text-blue-800">关键概念</h3>
                        <div class="mt-2 text-sm text-blue-700">
                            <p><code>Profile</code> 是 Spring Boot 提供的多环境配置解决方案，允许开发者定义不同环境的配置，并通过简单的开关切换环境。</p>
                        </div>
                    </div>
                </div>
            </div>
        </section>

        <!-- 多环境配置的概述 -->
        <section class="mb-16">
            <h2 class="text-3xl font-bold mb-6 flex items-center">
                <i class="fas fa-layer-group text-blue-500 mr-3"></i>
                <span>多环境配置的概述</span>
            </h2>
            
            <div class="mb-8">
                <img src="https://cdn.nlark.com/yuque/0/2025/png/21449790/1736665804336-b92f7a77-c19c-4c0f-a78c-b4cac30da57a.png" alt="多环境配置" class="w-full rounded-lg shadow-lg">
            </div>

            <div class="grid md:grid-cols-2 gap-8 mb-8">
                <div class="bg-white p-6 rounded-lg shadow-md hover:shadow-lg transition-shadow duration-300">
                    <div class="text-blue-500 mb-4">
                        <i class="fas fa-question-circle text-2xl"></i>
                    </div>
                    <h3 class="text-xl font-semibold mb-3">为什么需要多环境配置？</h3>
                    <p class="text-gray-700">
                        多环境配置的需求来源于应用在不同阶段和环境中可能需要不同的设置。开发环境通常使用本地的数据库、较低的日志级别、调试信息等；测试环境需要连接到测试数据库，执行一些集成测试；生产环境中的数据库通常需要更高的安全性和性能。
                    </p>
                </div>
                
                <div class="bg-white p-6 rounded-lg shadow-md hover:shadow-lg transition-shadow duration-300">
                    <div class="text-green-500 mb-4">
                        <i class="fas fa-cogs text-2xl"></i>
                    </div>
                    <h3 class="text-xl font-semibold mb-3">Spring Boot 中的实现方式</h3>
                    <p class="text-gray-700">
                        Spring Boot 通过 <code class="bg-green-100 px-1 py-0.5 rounded">Profiles</code> 来支持多环境配置，允许在不同环境中加载不同的配置文件。每个配置文件可以针对不同的环境做出定制，如 <code>application-dev.properties</code> 用于开发环境，<code>application-prod.properties</code> 用于生产环境。
                    </p>
                </div>
            </div>

            <div class="bg-white rounded-lg shadow-lg overflow-hidden mb-8">
                <div class="bg-gray-100 px-6 py-4 border-b">
                    <h3 class="font-semibold text-gray-800 flex items-center">
                        <i class="fas fa-map-marked-alt text-yellow-500 mr-2"></i>
                        <span>多环境配置的应用场景</span>
                    </h3>
                </div>
                <div class="p-6">
                    <ul class="space-y-4">
                        <li class="flex items-start">
                            <div class="flex-shrink-0 h-5 w-5 text-blue-500">
                                <i class="fas fa-laptop-code"></i>
                            </div>
                            <p class="ml-3 text-gray-700"><strong>开发环境</strong>：本地数据库、调试模式和其他开发工具的配置</p>
                        </li>
                        <li class="flex items-start">
                            <div class="flex-shrink-0 h-5 w-5 text-purple-500">
                                <i class="fas fa-vial"></i>
                            </div>
                            <p class="ml-3 text-gray-700"><strong>测试环境</strong>：集成测试、单元测试等需要连接测试环境的数据库或第三方服务</p>
                        </li>
                        <li class="flex items-start">
                            <div class="flex-shrink-0 h-5 w-5 text-green-500">
                                <i class="fas fa-server"></i>
                            </div>
                            <p class="ml-3 text-gray-700"><strong>生产环境</strong>：生产环境通常需要更高的安全性和性能配置，比如使用外部服务、生产级数据库连接</p>
                        </li>
                    </ul>
                </div>
            </div>

            <div class="bg-yellow-50 border-l-4 border-yellow-400 p-4 rounded">
                <div class="flex">
                    <div class="flex-shrink-0">
                        <i class="fas fa-lightbulb text-yellow-500 text-xl"></i>
                    </div>
                    <div class="ml-3">
                        <h3 class="text-sm font-medium text-yellow-800">配置隔离的最佳实践</h3>
                        <div class="mt-2 text-sm text-yellow-700">
                            <p>在 Spring Boot 中，可以通过 <code class="bg-yellow-100 px-1 py-0.5 rounded">@Profile</code> 注解或在配置文件中通过 <code>application-{profile}.properties</code> 来区分环境。Spring Boot 支持将配置放在外部文件或系统环境变量中，从而使得每个环境的配置不需要硬编码到应用中。</p>
                        </div>
                    </div>
                </div>
            </div>
        </section>

        <div class="section-divider"></div>

        <!-- Spring Boot 中的配置文件管理 -->
        <section class="mb-16">
            <h2 class="text-3xl font-bold mb-6 flex items-center">
                <i class="fas fa-file-alt text-indigo-500 mr-3"></i>
                <span>Spring Boot 中的配置文件管理</span>
            </h2>
            
            <div class="mb-8">
                <img src="https://cdn.nlark.com/yuque/0/2025/png/21449790/1736665834482-631e6720-132c-416e-8084-3eea57624354.png" alt="Spring Boot 配置文件" class="w-full rounded-lg shadow-lg">
            </div>

            <div class="mb-8">
                <h3 class="text-2xl font-semibold mb-4">1. 配置文件的类型</h3>
                <p class="mb-4">Spring Boot 默认支持两种配置文件格式：</p>
                
                <div class="grid md:grid-cols-2 gap-6 mb-6">
                    <div>
                        <div class="bg-gray-800 rounded-t-lg p-3 flex items-center">
                            <div class="h-3 w-3 bg-red-500 rounded-full mr-2"></div>
                            <div class="h-3 w-3 bg-yellow-500 rounded-full mr-2"></div>
                            <div class="h-3 w-3 bg-green-500 rounded-full"></div>
                            <span class="text-white text-sm ml-2">application.properties</span>
                        </div>
                        <div class="code-block">
                            <pre>server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret</pre>
                        </div>
                    </div>
                    
                    <div>
                        <div class="bg-gray-800 rounded-t-lg p-3 flex items-center">
                            <div class="h-3 w-3 bg-red-500 rounded-full mr-2"></div>
                            <div class="h-3 w-3 bg-yellow-500 rounded-full mr-2"></div>
                            <div class="h-3 w-3 bg-green-500 rounded-full"></div>
                            <span class="text-white text-sm ml-2">application.yml</span>
                        </div>
                        <div class="code-block">
                            <pre>server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: secret</pre>
                        </div>
                    </div>
                </div>
                
                <p class="text-gray-700">YAML 格式通过层级缩进来表示结构，能够更清晰地组织和表达配置数据。</p>
            </div>

            <div class="mb-8">
                <h3 class="text-2xl font-semibold mb-4">2. 配置文件的优先级与加载顺序</h3>
                <p class="mb-4">Spring Boot 在启动时会按照一定的顺序加载配置文件，配置文件的加载优先级依次递增：</p>
                
                <div class="bg-white rounded-lg shadow-md p-6 mb-6">
                    <ol class="list-decimal pl-5 space-y-3">
                        <li><strong>命令行参数</strong>：通过命令行传入的参数优先级最高</li>
                        <li><code>application.properties</code> 或 <code>application.yml</code>：项目中的配置文件，默认加载</li>
                        <li><strong>外部配置文件</strong>：可以通过 <code>spring.config.location</code> 指定外部的配置文件路径</li>
                        <li><strong>环境变量</strong>：如果没有在配置文件中找到某项配置，Spring Boot 会查找环境变量</li>
                        <li><strong>Java System 属性</strong>：如 <code>-D</code> 参数传入的系统属性</li>
                    </ol>
                </div>
            </div>

            <div class="mb-8">
                <h3 class="text-2xl font-semibold mb-4">3. Profile 和配置文件的切换</h3>
                <p class="mb-4">在 Spring Boot 中，<code>Profile</code> 是一种用于标识不同运行环境的机制，可以帮助我们在不同的环境下加载不同的配置。</p>
                
                <div class="grid md:grid-cols-2 gap-6 mb-6">
                    <div class="bg-white p-6 rounded-lg shadow-md">
                        <h4 class="font-semibold text-lg mb-3 flex items-center">
                            <i class="fas fa-toggle-on text-blue-500 mr-2"></i>
                            <span>指定 Profile</span>
                        </h4>
                        <p class="mb-3">可以在 <code>application.properties</code> 或 <code>application.yml</code> 中使用 <code>spring.profiles.active</code> 属性指定当前的运行环境（如开发、测试、生产等）：</p>
                        <div class="code-block">
                            <pre>spring.profiles.active=dev</pre>
                        </div>
                    </div>
                    
                    <div class="bg-white p-6 rounded-lg shadow-md">
                        <h4 class="font-semibold text-lg mb-3 flex items-center">
                            <i class="fas fa-code-branch text-green-500 mr-2"></i>
                            <span>环境特定的配置文件</span>
                        </h4>
                        <p class="mb-3">可以创建专门为某个环境定制的配置文件，如 <code>application-dev.properties</code>、<code>application-prod.properties</code>：</p>
                        <div class="code-block">
                            <pre># application-dev.properties
spring.datasource.url=jdbc:mysql://dev-db:3306/mydb

# application-prod.properties
spring.datasource.url=jdbc:mysql://prod-db:3306/mydb</pre>
                        </div>
                    </div>
                </div>
            </div>

            <div class="mb-8">
                <h3 class="text-2xl font-semibold mb-4">4. 配置文件的外部化</h3>
                <p class="mb-4">Spring Boot 允许将配置文件外部化，避免硬编码在应用中。常见的外部化方式有：</p>
                
                <div class="bg-white rounded-lg shadow-md overflow-hidden mb-6">
                    <div class="grid md:grid-cols-2 divide-x divide-gray-200">
                        <div class="p-6">
                            <h4 class="font-semibold text-lg mb-3 flex items-center">
                                <i class="fas fa-terminal text-purple-500 mr-2"></i>
                                <span>通过命令行参数指定</span>
                            </h4>
                            <div class="code-block">
                                <pre>java -jar myapp.jar --spring.config.location=file:/path/to/application.properties</pre>
                            </div>
                        </div>
                        <div class="p-6">
                            <h4 class="font-semibold text-lg mb-3 flex items-center">
                                <i class="fas fa-globe text-teal-500 mr-2"></i>
                                <span>通过环境变量指定</span>
                            </h4>
                            <div class="code-block">
                                <pre>export SPRING_CONFIG_LOCATION=/path/to/application.properties
java -jar myapp.jar</pre>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="bg-blue-50 border-l-4 border-blue-500 p-4 rounded">
                <div class="flex">
                    <div class="flex-shrink-0">
                        <i class="fas fa-key text-blue-500 text-xl"></i>
                    </div>
                    <div class="ml-3">
                        <h3 class="text-sm font-medium text-blue-800">敏感信息的管理</h3>
                        <div class="mt-2 text-sm text-blue-700">
                            <p>在配置文件中，可能会涉及到敏感信息（如数据库密码、API 密钥等）。Spring Boot 提供了多种方式来保护这些敏感配置：</p>
                            <ul class="list-disc pl-5 mt-2">
                                <li><strong>加密配置</strong>：使用 <code>jasypt-spring-boot</code> 等工具来加密配置文件中的敏感信息</li>
                                <li><strong>环境变量管理</strong>：将敏感信息放在系统环境变量中，而非配置文件中</li>
                            </ul>
                        </div>
                    </div>
                </div>
            </div>
        </section>

        <div class="section-divider"></div>

        <!-- 使用 Profiles 管理不同环境配置 -->
        <section class="mb-16">
            <h2 class="text-3xl font-bold mb-6 flex items-center">
                <i class="fas fa-sliders-h text-purple-500 mr-3"></i>
                <span>使用 Profiles 管理不同环境配置</span>
            </h2>
            
            <div class="mb-8">
                <h3 class="text-2xl font-semibold mb-4">1. 什么是 Profile？</h3>
                <p class="mb-4">Spring Boot 的 <code>Profile</code> 是一种标识和管理不同环境的机制，可以根据当前激活的 Profile 来加载不同的配置文件或配置项。通过 Profile，开发者可以在开发、测试、生产等多个环境中维护不同的配置，避免在同一个配置文件中管理所有环境的配置。</p>
            </div>
            
            <div class="mb-8">
                <h3 class="text-2xl font-semibold mb-4">2. 如何使用 Profiles 管理环境配置？</h3>
                
                <div class="mb-6">
                    <h4 class="text-xl font-semibold mb-3 flex items-center">
                        <i class="fas fa-toggle-on text-blue-500 mr-2"></i>
                        <span>2.1 定义和激活 Profile</span>
                    </h4>
                    <p class="mb-4">Profile 是通过 <code>@Profile</code> 注解或者通过配置文件来激活的。在 Spring Boot 中，可以通过两种方式来指定当前使用的 Profile：</p>
                    
                    <div class="grid md:grid-cols-3 gap-4 mb-6">
                        <div class="bg-white p-4 rounded-lg shadow-sm border border-gray-200">
                            <h5 class="font-medium text-gray-800 mb-2">在配置文件中设置</h5>
                            <div class="code-block">
                                <pre># application.properties
spring.profiles.active=dev</pre>
                            </div>
                        </div>
                        <div class="bg-white p-4 rounded-lg shadow-sm border border-gray-200">
                            <h5 class="font-medium text-gray-800 mb-2">通过命令行参数激活</h5>
                            <div class="code-block">
                                <pre>java -jar myapp.jar --spring.profiles.active=prod</pre>
                            </div>
                        </div>
                        <div class="bg-white p-4 rounded-lg shadow-sm border border-gray-200">
                            <h5 class="font-medium text-gray-800 mb-2">通过环境变量激活</h5>
                            <div class="code-block">
                                <pre>export SPRING_PROFILES_ACTIVE=prod
java -jar myapp.jar</pre>
                            </div>
                        </div>
                    </div>
                </div>
                
                <div class="mb-6">
                    <h4 class="text-xl font-semibold mb-3 flex items-center">
                        <i class="fas fa-code-branch text-green-500 mr-2"></i>
                        <span>2.2 根据 Profile 加载配置文件</span>
                    </h4>
                    <p class="mb-4">Spring Boot 会根据当前激活的 Profile 来加载对应的配置文件。例如，假设你有多个不同环境的配置文件：</p>
                    
                    <div class="bg-white rounded-lg shadow-md overflow-hidden mb-6">
                        <div class="grid md:grid-cols-3 divide-x divide-gray-200">
                            <div class="p-4">
                                <h5 class="font-semibold text-gray-800 mb-2">开发环境</h5>
                                <div class="code-block">
                                    <pre>application-dev.properties</pre>
                                </div>
                            </div>
                            <div class="p-4">
                                <h5 class="font-semibold text-gray-800 mb-2">生产环境</h5>
                                <div class="code-block">
                                    <pre>application-prod.properties</pre>
                                </div>
                            </div>
                            <div class="p-4">
                                <h5 class="font-semibold text-gray-800 mb-2">测试环境</h5>
                                <div class="code-block">
                                    <pre>application-test.properties</pre>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                
                <div class="mb-6">
                    <h4 class="text-xl font-semibold mb-3 flex items-center">
                        <i class="fas fa-code text-indigo-500 mr-2"></i>
                        <span>2.3 使用 @Profile 注解在代码中区分不同环境</span>
                    </h4>
                    <p class="mb-4">除了在配置文件中使用 Profile，Spring Boot 还允许我们在代码中使用 <code>@Profile</code> 注解来根据 Profile 的激活与否选择是否加载某些 Bean。</p>
                    
                    <div class="grid md:grid-cols-2 gap-6">
                        <div class="bg-white p-6 rounded-lg shadow-md">
                            <div class="code-block">
                                <pre>@Configuration
@Profile("dev")
public class DevConfig {
    @Bean
    public DataSource dataSource() {
        // 开发环境的数据源配置
        return new DataSource("dev-db-url");
    }
}</pre>
                            </div>
                        </div>
                        <div class="bg-white p-6 rounded-lg shadow-md">
                            <div class="code-block">
                                <pre>@Configuration
@Profile("prod")
public class ProdConfig {
    @Bean
    public DataSource dataSource() {
        // 生产环境的数据源配置
        return new DataSource("prod-db-url");
    }
}</pre>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            
            <div class="mb-8">
                <h3 class="text-2xl font-semibold mb-4">3. 配置文件的优先级与覆盖</h3>
                <p class="mb-4">在多个配置文件中，如果有相同的配置项，Spring Boot 会根据文件的加载顺序和 Profile 的优先级来决定最终的配置值。例如：</p>
                
                <div class="bg-white rounded-lg shadow-md p-6 mb-6">
                    <div class="mb-4">
                        <h4 class="font-semibold text-gray-800 mb-2">application.properties</h4>
                        <p class="text-gray-700">所有环境通用的配置</p>
                        <div class="code-block">
                            <pre>server.port=8080</pre>
                        </div>
                    </div>
                    
                    <div class="mb-4">
                        <h4 class="font-semibold text-gray-800 mb-2">application-prod.properties</h4>
                        <p class="text-gray-700">生产环境专用配置</p>
                        <div class="code-block">
                            <pre>server.port=80</pre>
                        </div>
                    </div>
                    
                    <div class="bg-blue-50 p-4 rounded border border-blue-100">
                        <p class="text-blue-800">如果在 <code>application.properties</code> 中配置了 <code>server.port=8080</code>，在 <code>application-prod.properties</code> 中配置了 <code>server.port=80</code>，并且激活了 <code>prod</code> Profile，那么最终的端口配置会使用 <code>application-prod.properties</code> 中的 <code>server.port=80</code>。</p>
                    </div>
                </div>
            </div>
            
            <div class="mb-8">
                <h3 class="text-2xl font-semibold mb-4">4. Spring Boot Profile 的常见实践</h3>
                
                <div class="bg-white rounded-lg shadow-md overflow-hidden">
                    <div class="grid md:grid-cols-2 divide-x divide-gray-200">
                        <div class="p-6">
                            <ul class="space-y-4">
                                <li class="flex items-start">
                                    <div class="flex-shrink-0 h-5 w-5 text-green-500">
                                        <i class="fas fa-check-circle"></i>
                                    </div>
                                    <p class="ml-3 text-gray-700"><strong>使用环境变量</strong>：通过环境变量来设置不同的 Profile，可以方便地在不同的部署环境中切换配置</p>
                                </li>
                                <li class="flex items-start">
                                    <div class="flex-shrink-0 h-5 w-5 text-green-500">
                                        <i class="fas fa-check-circle"></i>
                                    </div>
                                    <p class="ml-3 text-gray-700"><strong>配置多套数据库连接</strong>：开发环境使用本地数据库，生产环境使用生产数据库，测试环境使用专门的测试数据库</p>
                                </li>
                            </ul>
                        </div>
                        <div class="p-6">
                            <ul class="space-y-4">
                                <li class="flex items-start">
                                    <div class="flex-shrink-0 h-5 w-5 text-green-500">
                                        <i class="fas fa-check-circle"></i>
                                    </div>
                                    <p class="ml-3 text-gray-700"><strong>不同的日志级别配置</strong>：在开发环境中，可能需要更详细的日志信息，而生产环境则需要更简洁的日志</p>
                                </li>
                                <li class="flex items-start">
                                    <div class="flex-shrink-0 h-5 w-5 text-green-500">
                                        <i class="fas fa-check-circle"></i>
                                    </div>
                                    <p class="ml-3 text-gray-700"><strong>外部配置管理</strong>：可以通过外部的配置文件来管理环境配置，使得应用可以在不同环境下保持一致性</p>
                                </li>
                            </ul>
                        </div>
                    </div>
                </div>
            </div>
        </section>

        <div class="section-divider"></div>

        <!-- Spring Boot 配置的外部化 -->
        <section class="mb-16">
            <h2 class="text-3xl font-bold mb-6 flex items-center">
                <i class="fas fa-external-link-alt text-teal-500 mr-3"></i>
                <span>Spring Boot 配置的外部化</span>
            </h2>
            
            <p class="text-lg mb-8">
                Spring Boot 提供了灵活的配置机制，可以轻松将应用程序的配置外部化，避免将敏感信息（如数据库密码、API 密钥等）硬编码在代码中。外部化配置不仅可以使应用程序更具可维护性，还能提高灵活性和安全性。尤其在容器化、微服务架构中，外部化配置变得尤为重要。
            </p>
            
            <div class="mb-8">
                <h3 class="text-2xl font-semibold mb-4">1. 外部化配置的概念</h3>
                <p class="mb-4">外部化配置指的是将应用程序的配置从代码中分离出来，将其存储在外部位置（如文件、环境变量、配置服务器等）。Spring Boot 支持从多种外部源加载配置，这样就可以避免每次更改配置时都需要重新构建和部署应用程序。</p>
            </div>
            
            <div class="mb-8">
                <h3 class="text-2xl font-semibold mb-4">2. 外部化配置的常见方式</h3>
                <p class="mb-4">Spring Boot 提供了多种外部化配置的方式，可以根据需求选择合适的方法。</p>
                
                <div class="grid md:grid-cols-2 gap-8 mb-8">
                    <div class="bg-white p-6 rounded-lg shadow-md">
                        <div class="text-blue-500 mb-4">
                            <i class="fas fa-file-alt text-2xl"></i>
                        </div>
                        <h4 class="text-xl font-semibold mb-3">使用外部配置文件</h4>
                        <p class="text-gray-700 mb-4">Spring Boot 支持将配置文件放在项目外部，或者通过命令行传入外部配置。</p>
                        <div class="code-block">
                            <pre>java -jar myapp.jar --spring.config.location=file:/path/to/application.properties</pre>
                        </div>
                    </div>
                    
                    <div class="bg-white p-6 rounded-lg shadow-md">
                        <div class="text-green-500 mb-4">
                            <i class="fas fa-server text-2xl"></i>
                        </div>
                        <h4 class="text-xl font-semibold mb-3">使用 Spring Cloud Config</h4>
                        <p class="text-gray-700 mb-4">Spring Cloud Config 提供了配置中心来集中管理和外部化配置，支持动态刷新和版本控制。</p>
                        <div class="code-block">
                            <pre>@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}</pre>
                        </div>
                    </div>
                </div>
            </div>
            
            <div class="mb-8">
                <h3 class="text-2xl font-semibold mb-4">3. 优先级与加载顺序</h3>
                <p class="mb-4">Spring Boot 会按照一定的优先级加载配置项，如果不同来源的配置项有重复，后加载的配置将覆盖前加载的配置。配置的加载顺序如下：</p>
                
                <div class="bg-white rounded-lg shadow-md p-6 mb-6">
                    <ol class="list-decimal pl-5 space-y-3">
                        <li><strong>命令行参数</strong>：优先级最高</li>
                        <li><code>application.properties</code> 或 <code>application.yml</code>：项目中的配置文件</li>
                        <li><strong>外部配置文件</strong>：通过 <code>spring.config.location</code> 指定的外部配置文件</li>
                        <li><strong>环境变量</strong>：操作系统的环境变量</li>
                        <li><strong>系统属性</strong>：如 <code>-D</code> 参数传入的系统属性</li>
                    </ol>
                </div>
            </div>
            
            <div class="mb-8">
                <h3 class="text-2xl font-semibold mb-4">4. 敏感信息的外部化</h3>
                <p class="mb-4">为了确保应用程序的安全性，敏感信息（如数据库密码、API 密钥等）不应该存储在版本控制系统中。Spring Boot 提供了以下几种方式来处理敏感信息：</p>
                
                <div class="grid md:grid-cols-2 gap-6">
                    <div class="bg-white p-6 rounded-lg shadow-md">
                        <h4 class="font-semibold text-lg mb-3 flex items-center">
                            <i class="fas fa-key text-purple-500 mr-2"></i>
                            <span>环境变量</span>
                        </h4>
                        <p class="mb-3">将敏感信息存储在环境变量中，而不是硬编码在配置文件中：</p>
                        <div class="code-block">
                            <pre>export SPRING_DATASOURCE_PASSWORD=secret
java -jar myapp.jar</pre>
                        </div>
                    </div>
                    
                    <div class="bg-white p-6 rounded-lg shadow-md">
                        <h4 class="font-semibold text-lg mb-3 flex items-center">
                            <i class="fas fa-lock text-red-500 mr-2"></i>
                            <span>加密配置</span>
                        </h4>
                        <p class="mb-3">使用 Jasypt 加密配置文件中的敏感信息：</p>
                        <div class="code-block">
                            <pre># application.properties
jasypt.encryptor.password=secretKey
spring.datasource.password=ENC(encrypted_password)</pre>
                        </div>
                    </div>
                </div>
            </div>
        </section>

        <div class="section-divider"></div>

        <!-- 配置文件加密与敏感数据保护 -->
        <section class="mb-16">
            <h2 class="text-3xl font-bold mb-6 flex items-center">
                <i class="fas fa-lock text-red-500 mr-3"></i>
                <span>配置文件加密与敏感数据保护</span>
            </h2>
            
            <p class="text-lg mb-8">
                在现代应用程序中，配置文件通常包含敏感数据，如数据库密码、API 密钥、用户名等。如果这些信息被泄露，可能会导致严重的安全问题。因此，如何保护配置文件中的敏感数据，是开发和运维过程中必须关注的重点。Spring Boot 提供了多种方式来加密配置文件中的敏感数据，确保在使用配置文件时，不会暴露敏感信息。
            </p>
            
            <div class="mb-8">
                <h3 class="text-2xl font-semibold mb-4">1. 敏感数据保护的需求</h3>
                <p class="mb-4">在开发和生产环境中，敏感数据的保护尤为重要。常见的敏感数据包括：</p>
                
                <div class="bg-white rounded-lg shadow-md p-6 mb-6">
                    <ul class="grid md:grid-cols-2 gap-4">
                        <li class="flex items-start">
                            <div class="flex-shrink-0 h-5 w-5 text-red-500">
                                <i class="fas fa-database"></i>
                            </div>
                            <p class="ml-3 text-gray-700">数据库密码、用户名</p>
                        </li>
                        <li class="flex items-start">
                            <div class="flex-shrink-0 h-5 w-5 text-red-500">
                                <i class="fas fa-key"></i>
                            </div>
                            <p class="ml-3 text-gray-700">第三方 API 密钥</p>
                        </li>
                        <li class="flex items-start">
                            <div class="flex-shrink-0 h-5 w-5 text-red-500">
                                <i class="fas fa-user-shield"></i>
                            </div>
                            <p class="ml-3 text-gray-700">OAuth2 客户端密钥</p>
                        </li>
                        <li class="flex items-start">
                            <div class="flex-shrink-0 h-5 w-5 text-red-500">
                                <i class="fas fa-ticket-alt"></i>
                            </div>
                            <p class="ml-3 text-gray-700">访问令牌（Access Token）</p>
                        </li>
                    </ul>
                </div>
            </div>
            
            <div class="mb-8">
                <h3 class="text-2xl font-semibold mb-4">2. 配置文件加密的策略</h3>
                <p class="mb-4">加密配置文件中的敏感数据，常见的方式有：</p>
                
                <div class="grid md:grid-cols-3 gap-6 mb-8">
                    <div class="bg-white p-6 rounded-lg shadow-md">
                        <div class="text-blue-500 mb-4">
                            <i class="fas fa-exchange-alt text-2xl"></i>
                        </div>
                        <h4 class="text-xl font-semibold mb-3">对称加密</h4>
                        <p class="text-gray-700">使用相同的密钥对敏感数据进行加密和解密。常见的对称加密算法有 AES（高级加密标准）。</p>
                    </div>
                    
                    <div class="bg-white p-6 rounded-lg shadow-md">
                        <div class="text-purple-500 mb-4">
                            <i class="fas fa-key text-2xl"></i>
                        </div>
                        <h4 class="text-xl font-semibold mb-3">非对称加密</h4>
                        <p class="text-gray-700">使用公钥加密，私钥解密。适用于需要更高安全性的场景，通常用于数据交换和密钥管理。</p>
                    </div>
                    
                    <div class="bg-white p-6 rounded-lg shadow-md">
                        <div class="text-green-500 mb-4">
                            <i class="fas fa-shield-alt text-2xl"></i>
                        </div>
                        <h4 class="text-xl font-semibold mb-3">基于属性的加密</h4>
                        <p class="text-gray-700">仅对配置文件中的特定属性进行加密。例如，可以只加密数据库连接字符串中的密码部分，而保留其他非敏感信息明文。</p>
                    </div>
                </div>
            </div>
            
            <div class="mb-8">
                <h3 class="text-2xl font-semibold mb-4">3. Jasypt 配置文件加密</h3>
                <p class="mb-4">Jasypt 是 Java 中最常用的加密工具之一，它提供了易于集成的加密方案，适合用来加密 Spring Boot 配置文件中的敏感信息。</p>
                
                <div class="mb-8">
                    <h4 class="text-xl font-semibold mb-3">3.1 引入 Jasypt 依赖</h4>
                    <p class="mb-3">首先，在 <code>pom.xml</code> 中添加 Jasypt 的依赖：</p>
                    <div class="code-block">
                        <pre>&lt;dependency&gt;
    &lt;groupId&gt;org.jasypt&lt;/groupId&gt;
    &lt;artifactId&gt;jasypt-spring-boot-starter&lt;/artifactId&gt;
    &lt;version&gt;3.0.3&lt;/version&gt;
&lt;/dependency&gt;</pre>
                    </div>
                </div>
                
                <div class="mb-8">
                    <h4 class="text-xl font-semibold mb-3">3.2 加密配置属性</h4>
                    <p class="mb-3">使用 Jasypt 加密属性时，首先需要对敏感数据进行加密。可以通过 Jasypt 提供的工具进行加密，示例如下：</p>
                    <div class="code-block">
                        <pre>import org.jasypt.util.text.BasicTextEncryptor;

public class EncryptPassword {
    public static void main(String[] args) {
        BasicTextEncryptor encryptor = new BasicTextEncryptor();
        encryptor.setPassword("secretKey");  // 设置加密密钥
        String encryptedPassword = encryptor.encrypt("myPassword123");  // 加密敏感信息
        System.out.println(encryptedPassword);
    }
}</pre>
                    </div>
                </div>
                
                <div class="mb-8">
                    <h4 class="text-xl font-semibold mb-3">3.3 在配置文件中使用加密后的数据</h4>
                    <p class="mb-3">将加密后的密码放入 <code>application.properties</code> 或 <code>application.yml</code> 中，格式为 <code>ENC(...)</code>：</p>
                    <div class="code-block">
                        <pre>spring.datasource.password=ENC(1y2l1G0Uht9HgddKxsT8Tg==)</pre>
                    </div>
                </div>
                
                <div class="mb-8">
                    <h4 class="text-xl font-semibold mb-3">3.4 配置解密</h4>
                    <p class="mb-3">在 Spring Boot 启动时，Jasypt 会自动解密这些加密过的配置项。为此，需要在 <code>application.properties</code> 中配置解密所需的密钥：</p>
                    <div class="code-block">
                        <pre>jasypt.encryptor.password=secretKey</pre>
                    </div>
                </div>
            </div>
            
            <div class="bg-red-50 border-l-4 border-red-500 p-4 rounded">
                <div class="flex">
                    <div class="flex-shrink-0">
                        <i class="fas fa-exclamation-triangle text-red-500 text-xl"></i>
                    </div>
                    <div class="ml-3">
                        <h3 class="text-sm font-medium text-red-800">安全注意事项</h3>
                        <div class="mt-2 text-sm text-red-700">
                            <p>加密密钥必须妥善保管，不应该存储在版本控制系统中。建议通过环境变量或安全密钥管理服务来提供加密密钥。</p>
                        </div>
                    </div>
                </div>
            </div>
        </section>

        <!-- Concept Diagram -->
        <section class="mb-16">
            <h2 class="text-3xl font-bold mb-6 flex items-center">
                <i class="fas fa-project-diagram text-indigo-500 mr-3"></i>
                <span>Spring Boot 多环境配置概念图</span>
            </h2>
            
            <div class="mermaid">
                graph TD
                    A[Spring Boot 应用] --> B[配置文件]
                    B --> C[application.properties]
                    B --> D[application.yml]
                    C --> E[通用配置]
                    D --> E
                    B --> F[环境特定配置]
                    F --> G[application-dev.properties]
                    F --> H[application-prod.properties]
                    F --> I[application-test.properties]
                    A --> J[外部配置源]
                    J --> K[环境变量]
                    J --> L[命令行参数]
                    J --> M[Spring Cloud Config]
                    M --> N[Vault]
                    A --> O[配置加密]
                    O --> P[Jasypt]
                    O --> Q[Spring Cloud Config + Vault]
            </div>
        </section>
    </main>

    <!-- Footer -->
    <footer class="bg-gray-900 text-gray-300 py-8">
        <div class="container mx-auto px-6 text-center">
            <div class="flex flex-col items-center">
                <div class="mb-4">
                    <h3 class="text-xl font-semibold text-white">技术小馆</h3>
                </div>
                <div class="mb-6">
                    <a href="http://www.yuque.com/jtostring" class="text-blue-400 hover:text-blue-300 transition-colors duration-200">http://www.yuque.com/jtostring</a>
                </div>
                <div class="flex space-x-4">
                    <a href="#" class="text-gray-400 hover:text-white transition-colors duration-200">
                        <i class="fab fa-github text-xl"></i>
                    </a>
                    <a href="#" class="text-gray-400 hover:text-white transition-colors duration-200">
                        <i class="fab fa-twitter text-xl"></i>
                    </a>
                </div>
            </div>
        </div>
    </footer>

    <script>
        mermaid.initialize({
            startOnLoad: true,
            theme: 'default',
            flowchart: {
                useMaxWidth: true,
                htmlLabels: true,
                curve: 'basis'
            }
        });
    </script>
</body>
</html>
```